#ifndef FABRICARECURSOSALMACENAMIENTO_H_
#define FABRICARECURSOSALMACENAMIENTO_H_

class RecursoDeAlmacenamiento;

#include "../Constantes.h"
#include <string>
using namespace std;

class Indice;
class RecursoDeAlmacenamiento;
class RecursoDeAlmacenamientoDirecto;
class RecursoDeAlmacenamientoIndexado;
class FabricaCompuestos;

class FabricaRecursosAlmacenamiento {

private:
	FabricaRecursosAlmacenamiento();

public:

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~FabricaRecursosAlmacenamiento();

	/*
	 * Pre: -
	 * Pos: Devuelve la referencia a la fabrica de recursos.
	 */
	static FabricaRecursosAlmacenamiento* getFabrica();

	/*
	 * Pre: Parametros validos
	 * Pos: Crea un recurso de almacenamiento de registros.
	 */
	RecursoDeAlmacenamiento* crearRecursoArchivoRegistros(const string& path,
			cantBytes tamanioReg,tipo_estrategia_recurso tipoEstrategiaRecurso = SIN_BUFFER);

	/*
	 * Pre: Parametros validos
	 * Pos: Crea un recurso de almacenamiento de archivos con bloques.
	 */
	RecursoDeAlmacenamiento* crearRecursoArchivoBloques(const string& path,
			cantBytes tamanioBloque, tipo_estrategia_recurso tipoEstrategiaRecurso = SIN_BUFFER,tipo_fabrica_compuesto fabrica = FABRICA_BLOQUES);

	/*
	 * Pre: Parametros validos
	 * Pos: Crea un recurso de almacenamiento directo.
	 */
	RecursoDeAlmacenamientoDirecto* crearRecursoAccesoDirecto(
			const string& path, cantBytes tamanioReg, tipo_estrategia_recurso tipoEstrategiaRecurso = SIN_BUFFER);

	/*
	 * Pre: Parametros validos
	 * Pos: Crea un recurso de almacenamiento indexado por bloques.
	 */
	RecursoDeAlmacenamientoIndexado* crearRecursoIndexadoBloques(const string& path,
			cantBytes tamanioBloque, Indice* indice, tipo_estrategia_recurso tipoEstrategiaRecurso = SIN_BUFFER, tipo_fabrica_compuesto fabrica = FABRICA_BLOQUES);

	/*
	 * Pre: Parametros validos
	 * Pos: Crea un recurso de almacenamiento indexado con registros fijos.
	 */
	RecursoDeAlmacenamientoIndexado* crearRecursoIndexadoRegistros(const string& path,
			cantBytes tamanioReg, Indice* indice, tipo_estrategia_recurso tipoEstrategiaRecurso = SIN_BUFFER);

};

#endif /* FABRICARECURSOSALMACENAMIENTO_H_ */
